Fix Memory leaks. Don't allocate zero-length strings.
authoroliskoli <oliskoli@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 9 Feb 2006 19:07:36 +0000 (19:07 +0000)
committeroliskoli <oliskoli@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 9 Feb 2006 19:07:36 +0000 (19:07 +0000)
gpsbabel/gtm.c

index 50166ab7fa79d8d7aabbe97ae831c90ac32bd45a..db9cc890ad229b27dc9aea761875abe6d2dd23a0 100644 (file)
@@ -112,7 +112,11 @@ static char *
 fread_string(FILE *fd)
 {
        int len = fread_integer(fd);
-       char *val = xmalloc(len+1);
+       char *val;
+       
+       if (len == 0) return NULL;
+       
+       val = xmalloc(len+1);
        fread(val, 1, len, fd);
        while (len != 0 && val[len-1] == ' ')
                len--;
@@ -120,6 +124,15 @@ fread_string(FILE *fd)
        return val;
 }
 
+static void
+fread_string_discard(FILE *fd)
+{
+       char *temp = fread_string(fd);
+       if (temp != NULL) {
+               xfree(temp);
+       }
+}
+
 static char *
 fread_fixedstring(FILE *fd, int len)
 {
@@ -436,7 +449,7 @@ gtm_rd_init(const char *fname)
                fatal(MYNAME ": Invalid file format\n");
        if (version != 211)
                fatal(MYNAME ": Invalid format version\n");
-       free(name);
+       xfree(name);
 
        /* Header */
        fread_discard(fd, 15);
@@ -449,10 +462,10 @@ gtm_rd_init(const char *fname)
        im_count = fread_long(fd);
        ts_count = fread_long(fd);
        fread_discard(fd, 28);
-       fread_string(fd);
-       fread_string(fd);
-       fread_string(fd);
-       fread_string(fd);
+       fread_string_discard(fd);
+       fread_string_discard(fd);
+       fread_string_discard(fd);
+       fread_string_discard(fd);
 
        /* User Grid and Datum */
        fread_discard(fd, 34);
@@ -544,8 +557,8 @@ gtm_read(void)
 
        /* Image information */
        for (i = 0; i != im_count; i++) {
-               fread_string(fd);
-               fread_string(fd);
+               fread_string_discard(fd);
+               fread_string_discard(fd);
                fread_discard(fd, 30);
        }
 
@@ -576,7 +589,7 @@ gtm_read(void)
        if (wp_count) {
                for (i = 0; i != ws_count; i++) {
                        fread_discard(fd, 4);
-                       fread_string(fd);
+                       fread_string_discard(fd);
                        fread_discard(fd, 24);
                }
        }
@@ -638,7 +651,7 @@ gtm_read(void)
                        route_add_head(rte_head);
                }
                else {
-                       free(route_name);
+                       xfree(route_name);
                }
                route_add_wpt(rte_head, wpt);
        }